/**
 * 数据的翻页处理
 */
import {
    Http
} from "../utils/http.js"

class Paging {
    // 需要保存状态 
    start
    count
    req // {url,data.....}
    url //单独定义 避免后续污染
    locker = false // 锁
    moreData = true //是否有下一页的数据（默认为true 第一次才会执行）
    accumulator = [] //concat累加后的数据

    constructor(req, count = 10, start = 0) {
        this.req = req
        this.url = req.url
        this.start = start
        this.count = count
    }

    /**
     * 发送请求之前查看锁的状态,有锁返回，请求之后释放锁的状态
     */
    async getMoreData() {
        // 如果没有数据 就不进行api请求了
        if (!this.moreData) {
            return
        }
        if (!this._getLocker()) {
            return
        }
        // 获取数据之后 才进行解锁操作  所以加上await
        const data = await this._actualGetData()
        this._releaseLocker()
        return data
    }

    // 获取数据api
    async _actualGetData() {
        // 定义返回的数据结构
        let obj = {
            empty: Boolean, //数据是否为空
            items: [],
            moreData: Boolean, // 是否有下一页的数据
            accumulator: [], //concat累加后的数据
        }
        const req = this._getCurrentReq()
        let paging = await Http.request(req)
        if (!paging) {
            // 请求出现错误
            return null
        }

        if (paging.total === 0) {
            // 请求结果数据为空
            obj.empty = true
            obj.moreData = false
            return obj
        }

        this.moreData = Paging._isMoreData(paging.total_page, paging.page)
        console.log(this.moreData, 123)
        // 根据是否有下一页的数据  是否发送下一次请求/重新定义start
        if (this.moreData) {
            this.start += this.count
            console.log(this.start, this.count, 123)
            this._accumulator(paging.items) //数据累加

            // 返回数据
            obj.empty = false
            obj.items = paging.items
            obj.moreData = this.moreData
            obj.accumulator = this.accumulator
            return obj
        }
    }

    // 是否有下一页
    static _isMoreData(totalPage, currentPage) {
        return currentPage < totalPage
    }

    // 数据累加
    _accumulator(items) {
        this.accumulator = this.accumulator.concat(items)
    }

    /**
     * 请求url拼接
     */
    _getCurrentReq() {
        let url = this.url
        const params = `start=${this.start}&count=${this.count}`
        if (url.includes('?')) {
            url += '&' + params
        } else {
            url += '?' + params
        }
        this.req.url = url
        return this.req
    }

    /**
     * 获取锁的状态 
     * 当前有锁-返回/当前没锁-上锁
     */
    _getLocker() {
        if (this.locker) {
            return false
        }
        this.locker = true
        return true
    }

    // 锁的释放 
    _releaseLocker() {
        this.locker = false
    }

}

export {
    Paging
}